#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {

    if (argc < 2) {
        fprintf(stderr, "用法: %s <输入BMP文件>\n", argv[0]);
        return 1;
    }

    const char* inputFile = argv[1];
    const char* outputFile = "output.h";
    
    // 打开BMP文件
    FILE *bmpFile = fopen(inputFile, "rb");
    if (!bmpFile) {
        perror("❌ 无法打开输入文件");
        return 1;
    }

    // 获取文件大小
    fseek(bmpFile, 0, SEEK_END);
    long fileSize = ftell(bmpFile);
    fseek(bmpFile, 0, SEEK_SET);

    // 读取文件头获取数据偏移量
    unsigned char header[54];
    if (fread(header, 1, 54, bmpFile) != 54) {
        printf("⚠️ 文件头部读取失败\n");
        fclose(bmpFile);
        return 1;
    }

    // 验证BMP文件格式
    if (header[0] != 'B' || header[1] != 'M') {
        printf("⚠️ 无效的BMP文件格式\n");
        fclose(bmpFile);
        return 1;
    }

    // 从文件头获取像素数据偏移量（小端模式）
    long dataOffset = header[10] | (header[11] << 8) | (header[12] << 16) | (header[13] << 24);
    long dataSize = fileSize - dataOffset;
    
    printf("ℹ️ 文件大小: %ld 字节\n", fileSize);
    printf("ℹ️ 像素数据偏移量: %ld 字节\n", dataOffset);
    printf("ℹ️ 像素数据大小: %ld 字节\n", dataSize);

    if (dataSize <= 0) {
        printf("⚠️ 无效的像素数据大小\n");
        fclose(bmpFile);
        return 1;
    }

    // 定位并读取像素数据
    fseek(bmpFile, dataOffset, SEEK_SET);
    unsigned char *pixelData = malloc(dataSize - 2);
    if (!pixelData) {
        printf("⚠️ 内存分配失败\n");
        fclose(bmpFile);
        return 1;
    }

    if (fread(pixelData, 1, dataSize - 2, bmpFile) != dataSize - 2) {
        printf("⚠️ 像素数据读取失败\n");
        free(pixelData);
        fclose(bmpFile);
        return 1;
    }
    fclose(bmpFile);

    // 交换相邻字节的高低位
    for (long i = 0; i < dataSize - 3; i += 2) {
        unsigned char temp = pixelData[i];
        pixelData[i] = pixelData[i + 1];
        pixelData[i + 1] = temp;
    }

    // 创建输出文件
    FILE *out = fopen(outputFile, "w");
    if (!out) {
        perror("❌ 无法创建输出文件");
        free(pixelData);
        return 1;
    }

    // 输出为C数组格式
    fprintf(out, "// 自动生成的BMP数据 (%ld 字节)\n", dataSize - 2);
    fprintf(out, "const unsigned char bmp_data[%ld] = {\n", dataSize - 2);
    
    for (long i = 0; i < dataSize - 2; i++) {
        // 每行16个字节
        if (i % 16 == 0) fprintf(out, "    ");
        
        fprintf(out, "0x%02X", pixelData[i]);
        
        // 添加逗号（最后一个元素除外）
        if (i < dataSize - 3) fprintf(out, ", ");
        
        // 行尾换行
        if ((i + 1) % 16 == 0 || i == dataSize - 3) 
            fprintf(out, "\n");
    }
    
    fprintf(out, "};\n");
    fclose(out);
    free(pixelData);

    printf("✅ 转换成功! 输出文件: %s\n", outputFile);
    printf("✅ 总数据量: %ld 字节, 最后一行: %ld 个元素\n", dataSize - 2,
           (dataSize - 2) % 16 ? (dataSize - 2) % 16 : 16);

    return 0;
}